package com.uw.scenic.helper;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;


/**
 * 自定义classLoader加载指定Clazz文件
 */
public class MyClassLoader  extends ClassLoader {

    /**
     * class文件的路径
     */

    private String path;


    public MyClassLoader(String path) {
        this.path = path;
    }



    public MyClassLoader() {

    }



    public MyClassLoader(ClassLoader parent) {
        super(parent);
    }

//defineClass 通常是和findClass 方法一起使用的，我们通过覆盖ClassLoader父类的findClass 方法来实现类的加载规则，
    // 从而取得要加载类的字节码，然后调用defineClass方法生成类的Class 对象，如果你想在类被加载到JVM中时就被链接，
    // 那么可以接着调用另一个 resolveClass 方法，当然你也可以选择让JVM来解决什么时候才链接这个类。


    @Override

    protected Class<?> findClass(String name) throws ClassNotFoundException {

        System.out.println("hello i am hz‘s loader.");

        String classPath = path  + ".class";

        try (InputStream in = new FileInputStream(classPath)) {

            ByteArrayOutputStream out = new ByteArrayOutputStream();

            int i = 0;

            while ((i = in.read()) != -1) {

                out.write(i);

            }

            byte[] byteArray = out.toByteArray();

            //defineClass 方法用来将 字节流解析成 JVM 能够识别的 Class 对象

            return defineClass(null,byteArray, 0, byteArray.length);

        } catch (Exception e) {

            e.printStackTrace();

        }

        System.out.println("hello i am hz‘s loader.");

        return  null;

    }

    @Override

    public Class<?> loadClass(String name) throws ClassNotFoundException {

        return super.loadClass(name);

    }

}



